package com.seeyon.apps.nygj.event;

import com.seeyon.apps.collaboration.event.CollaborationStartEvent;
import com.seeyon.apps.collaboration.po.ColSummary;
import com.seeyon.apps.nygj.util.FtpKit;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.filemanager.manager.AttachmentManager;
import com.seeyon.ctp.common.filemanager.manager.FileManager;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.util.annotation.ListenEvent;
import org.apache.commons.logging.Log;

import java.io.File;
import java.util.List;

public class CustomCollaborationEventListener {

    private static final Log log = CtpLogFactory.getLog(CustomCollaborationEventListener.class);

    private CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private FileManager fileManager = (FileManager) AppContext.getBean("fileManager");
    private AttachmentManager attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager");

    /**
     * 监听协作开始事件
     * 当协作开始时，此方法会被触发，主要用于处理特定模板的表单数据
     * 它尝试从事件中获取摘要信息，并根据模板代码执行特定的逻辑
     *
     * @param event 协作开始事件，包含表单摘要和模板代码等信息
     */
    @ListenEvent(event = CollaborationStartEvent.class)
    public void onCollaborationStartEnent(CollaborationStartEvent event) {
        try {
            // 获取事件摘要
            ColSummary colSummary = event.getSummary();
            // 根据表单应用ID获取表单Bean
            FormBean formBean = cap4FormManager.getForm(colSummary.getFormAppid(), true);
            // 检查模板代码是否为特定值，以决定是否继续处理
            if (event.getTemplateCode().equals("YCSBSQD")) {
                // 获取表单主数据Bean
                FormDataMasterBean formDataMasterBean = cap4FormManager.getDataMasterBeanById(colSummary.getFormRecordid(), formBean, null);
                // 从表单数据中获取检测文件的字段值
                String jcwj_FileId = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("检测文件").getName()));
                // 获取FTP服务器信息
                String ip = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("ftp_ip").getName()));
                String post = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("ftp_port").getName()));
                String user = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("ftp_user").getName()));
                String password = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("ftp_password").getName()));
                String path = str(formDataMasterBean.getFieldValue(formBean.getFieldBeanByDisplay("ftp_path").getName()));
                // 如果检测文件ID不为空，则尝试上传文件
                if (!"".equals(jcwj_FileId)) {
                    List<Long> fileUrls = attachmentManager.getBySubReference(Long.parseLong(jcwj_FileId));
                    for (Long fileUrl : fileUrls) {
                        File file = fileManager.getFile(fileUrl);
                        // 使用FTP工具类上传文件
                        boolean isUpload = FtpKit.uploadFile(file, formDataMasterBean.getId() + ".zip", path, ip, post, user, password);
                        if (isUpload) {
                            log.info("附件上传成功!");
                        }
                    }
                }
            }
        } catch (Exception e) {
            // 日志记录任何在处理过程中发生的异常
            log.error("自定义申请发起前监听异常信息:", e);
        }
    }

    /**
     * 将给定对象转换为字符串
     * 如果对象为null，返回空字符串；如果对象是字符串类型，直接返回；
     * 否则，返回对象的toString()方法的结果
     *
     * @param o 要转换为字符串的对象
     * @return 对象的字符串表示，或空字符串（如果对象为null）
     */
    private static String str(Object o) {
        // 检查对象是否为null，是则返回空字符串
        if (o == null) {
            return "";
        }
        // 如果对象本身就是字符串，直接返回该字符串
        if (o instanceof String) {
            return (String) o;
        }
        // 对于其他情况，返回对象的toString()结果
        return o.toString();
    }

}
